package com.example.demo.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class BIOSocket {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8090);
        System.out.print("step1: new ServerSocket ");
        while (true) {
            Socket client = serverSocket.accept();
            System.out.println("step2:client\t" + client.getPort());
            new Thread(() -> {
                try {
                    InputStream in = client.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    while (true) {
                        System.out.println(reader.readLine());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}


/**
 * 优点
 * <p>
 * 代码简单，逻辑清晰。
 * <p>
 * 缺点
 * <p>
 * 由于stream的read操作是阻塞读，面对多个连接时 每个连接需要每线程。无法处理大量连接（C10K问题）。
 * <p>
 * <p>
 * 误区：可见JDK1.8中对于最初的BIO，在Linux OS下仍然使用的poll，poll本身也是相对比较高效的多路复用函数（支持非阻塞、多个socket同时检查event），
 * 只是限于JDK最初的stream API限制，无法支持非阻塞读取。
 */